<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
<script>
/*

04-循环：
    做大量的重复的操作，交给程序去完成
    例如：
    页面中生成100个标签
    给每个标签添加属性，文本等等

在控制台打印100次666：
    交给循环去完成


1.确定次数的循环(注意是确定次数) 执行重复的内容
    for循环
    书写格式：
        括号里面有三个部分 用分号分隔开来
        A B C 三个部分都是表达式
            A: 初始条件 在初始条件中用一个变量i表示初始条件
            B：结束判断 是一个布尔值 如果这个表达式为真 循环就没有结束
            C：状态改变
            D：需要被循环的代码
    for(A;B;C){
        D//可以有任意行代码
    }

    A B C D 执行顺序
    先判断再执行
        A => (B => D => C) => (B => D => C) =>...=> B
    
    for 循环中，B结束判断最重要
    所以可以写成这样：
        let i = 0 //因为A只执行一次
        for(;i<10;){
            console.log(i)

            //把C状态改变放到所有执行代码之后
            i++
        }


    for循环的标准写法：

    for(let i = 0;i < 100;i++){

    }

    写循环代码，永远抓住循环的变量(i,j,k)的意义

    循环打印下列数组中每个人的名字

    let students = [
        {
            name:"小羊"
        },
        {
            name:"火锅"
        },
        {
            name:"彭于晏"
        }
    ]
    //正着打印
    for(let i = 0;i < students.length;i++){
        console.log(students[i].name)
    }

    //倒着打印建议 弄清楚i的含义 i表示正向下标序号
    for(let i = 0;i < students.length;i++){
        //这里的key表示 反向下标序号
        let key = students.length - i - 1 //注意这个思想
        console.log(students[key].name)
    }



for 循环嵌套

for(let i = 0;i < 10;i++){
    //执行10次，不管写什么都会执行10次
    for(let j = 0;j < 6;j++){
        console.log("你好")
        //在每次i中执行6次
        console.log(i,j)
    }
}

循环的 单次跳过 和 循环的整体结束

    单次跳过：continue 继续下次循环，这次就算了：

for(let i = 0;i < 10;i++){
    if(i%2===0){ //如果i=3，就执行continue
        continue //continue 后面的这次就跳过不执行了
    }
    console.log(i)
}

    循环中止：break 直接掐断循环，不要再循环了：

for(let i = 0;i < 10;i++){
    if(i === 3){ //如果i=3，就执行break
        break //直接终止循环，后面的循环都不会再执行了
    }
    console.log(i)
}

如果存在多个循环嵌套的时候：
    break 和 continue 在结束的时候 都是跳出 break 和 continue 所在的层级的循环

如何让 break 和 continue 自主选择结束循环的循环体？
    for 循环是可以命名的
    直接给for循环添加一个名字：
    然后 break 名字 就可以停止这个循环

forA:for(let i = 0;i < 10;i++){
        //执行10次，不管写什么都会执行10次
    forB:for(let j = 0;j < 6;j++){
            if(j === 4){
                break forA
            }
            console.log(i,j)
        }
    }


while 也是循环
    本质和for循环是一致的
    使用场景是不定次数的循环

    while的语法是for循环的简化版

    while(判断条件){
        执行内容
    }

    等价于

    初始化A
    for(;判断条件;){
        执行内容(包括状态改变C)
    }

写一个简易的while循环
    let i = 0
    while(i < 10){
        console.log(i)
        i++
    }

不定次数的循环
for循环：
let arr = [1,1,23,34,57,13,32,24,56,12,3,45,64,-6,-8,3,5,543,-9]

//在这个数组中找到第一个小于0的数就打印出来
i是数组中的下标
for(let i = 0;i < arr.length;i++){
    if(arr[i] <0){
        console.log(i)
        break
    }
}

while循环：
let arr = [1,1,23,34,57,13,32,24,56,12,3,45,64,-6,-8,3,5,543,-9]
let i = 0
while(arr[i] >= 0){//当数组中下标所代表的数其数值大于0时
    i++//数组下标增加
}//只有判断条件为真，才进行循环遍历，否则就无法进行循环，这时只需将为假的内容打印输出即可
console.log(arr[i])

do{
    执行的代码
}while(判断条件)

04-循环：先执行一次循环，再判断，至少执行一次

例如：
while(false){
    console.log("123")
}//一次都不执行，因为只有为true的时候才会去执行后面的代码，而它是false

do{
    console.log("123")
}while(false)//先执行打印的内容，然后判断，false，所以不再执行，至少在判断前执行了一次



补充知识：
    i++ 在i自身基础上增加1 先返回原来的值，再自增(注意：因为是表达式，所以有返回值)
    i-- 在i自身基础上减少1 
    ++i 在i自身基础上增加1 先自增，再返回当前的值(注意：因为是表达式，所以有返回值)
    --i 在i自身基础上减少1 

let a = 3

console.log((++a) + (a++) + (a++))//4+4+5
(++a) 先3+1=4,再返回4，所以(++a)是4，现在a也是4
(a++) 先返回原来a的值，由刚刚可知a是4，所以(a++)先返回4，然后再自增1,4+1=5，所以现在a的值是5
(a++) 先返回原来a的值，由上文可知a是5，所以(a++)先返回5，然后再自增1,5+1=6，所以现在a的值是6

console.log((a++) + (++a) + (++a))//6+8+9
(a++) 先返回原来a的值，由上文可知a是6，所以(a++)先返回6，然后再自增1,6+1=7，所以现在a的值是7
(++a) 先7+1=8,再返回8，所以(++a)是8，现在a也是8
(++a) 先8+1=9,再返回9，所以(++a)是9，现在a也是9

*/


//let a = 2
//let b = ++a
//console.log(a,b)//3 3

//let c = 2
//let d = c++
//console.log(c,d)//3 2

//let a = 3

//console.log((++a) + (a++) + (a++))
//console.log(a)
//console.log((a++) + (++a) + (++a))
//console.log(a)


//在控制台中打印100次666
//需要计数

//初始一个变量i 初始值为1 每次循环都增加1 只要i还小于等于100 循环就没有结束
//for(let i = 0;i<3;i++){
//    console.log(i)
//}

//let students = [
//    {
//        name:"xiaoyang"
//    },
//    {
//        name:"huoguo"
//    },
//    {
//        name:"pengyuyan"
//    }
//]
//从0开始，小于循环次数
//for(let i = 0;i < students.length;i++){
//    console.log(students[i].name)
//}

//如果要倒着输出，循环可以这样写：
//i永远表示序号
//for(let i = 0;i < students.length;i++){
    //表示序号的反向序号
//    let key = students.length - i - 
//    console.log(students[key].name)
//}

//for(let i = 0;i < 2;i++){
//    console.log(i)
//}

//for(let i = 0;i < 7;i++){
    //执行10次，不管写什么都会执行10次
//    for(let j = 0;j < 6;j++){
        //console.log("你好")
        //console.log(i*6+j)
//        console.log(i,j)
//    }
//}

//for(var i = 0;i < 10;i++){
//    if(i===3){//如果i=3，就执行continue
//        break//continue 后面的这次就跳过不执行了
//    }
    //console.log(i)
//}
//console.log(i)

let arr = [1,1,23,34,57,13,32,24,56,12,3,45,64,-6,-8,3,5,543,-9]

//在这个数组中找到第一个小于0的数就打印出来

for(let i = 0;i < arr.length;i++){
    if(arr[i] < 0){
        console.log(arr[i])
        break
    }
}

</script>  
</body>
</html>